#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
初始化演示数据
包括：1个主管 + 4个下属 + 目标 + 项目 + 状态更新
"""

import sys
import io
# 设置输出编码为UTF-8
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

from app import create_app, db
from app.models.user import User
from app.models.objective import Objective, KeyResult
from app.models.project import Project, ProjectObjectiveLink
from app.models.status import StatusUpdate
from datetime import datetime, timedelta
import random

def init_demo_data():
    app = create_app()
    with app.app_context():
        # 清空现有数据（可选）
        print("清空现有数据...")
        db.drop_all()
        db.create_all()

        print("创建用户...")
        # 创建主管
        manager = User(
            username='manager',
            email='manager@company.com',
            full_name='张经理',
            role='manager',
            department='技术部'
        )
        manager.set_password('password123')
        db.session.add(manager)
        db.session.flush()  # 获取manager的id

        # 创建4个下属
        employees = []
        employee_data = [
            {
                'username': 'emp1',
                'email': 'emp1@company.com',
                'full_name': '李明',
                'department': '技术部'
            },
            {
                'username': 'emp2',
                'email': 'emp2@company.com',
                'full_name': '王芳',
                'department': '技术部'
            },
            {
                'username': 'emp3',
                'email': 'emp3@company.com',
                'full_name': '赵强',
                'department': '技术部'
            },
            {
                'username': 'emp4',
                'email': 'emp4@company.com',
                'full_name': '刘娜',
                'department': '技术部'
            }
        ]

        for emp_data in employee_data:
            emp = User(
                username=emp_data['username'],
                email=emp_data['email'],
                full_name=emp_data['full_name'],
                role='employee',
                department=emp_data['department'],
                manager_id=manager.id
            )
            emp.set_password('password123')
            db.session.add(emp)
            employees.append(emp)

        db.session.commit()
        print(f"✓ 创建了1个主管和{len(employees)}个下属")

        # 创建管理员（可选）
        admin = User(
            username='admin',
            email='admin@company.com',
            full_name='系统管理员',
            role='admin',
            department='管理层'
        )
        admin.set_password('password123')
        db.session.add(admin)
        db.session.commit()
        print("✓ 创建了管理员账户")

        print("\n创建部门目标...")
        # 创建部门级目标（主管的目标）
        objectives_data = [
            {
                'title': '今年营收达到600万',
                'description': '通过新客户开发和老客户维护，实现年度营收600万的目标',
                'type': 'operational',
                'level': 'department',
                'target': 600,
                'current': 420,
                'progress': 70
            },
            {
                'title': '达成10个新客户',
                'description': '拓展市场，签约10个新的企业客户',
                'type': 'strategic',
                'level': 'department',
                'target': 10,
                'current': 7,
                'progress': 70
            },
            {
                'title': '研发项目零延期',
                'description': '所有研发项目按时交付，实现零延期目标',
                'type': 'development',
                'level': 'department',
                'target': 100,
                'current': 85,
                'progress': 85
            }
        ]

        manager_objectives = []
        start_date = datetime.now().date()
        end_date = (datetime.now() + timedelta(days=365)).date()

        for obj_data in objectives_data:
            obj = Objective(
                title=obj_data['title'],
                description=obj_data['description'],
                owner_id=manager.id,
                level=obj_data['level'],
                type=obj_data['type'],
                start_date=start_date,
                end_date=end_date,
                progress=obj_data['progress'],
                status='active'
            )
            db.session.add(obj)
            manager_objectives.append((obj, obj_data))

        db.session.commit()
        print(f"✓ 创建了{len(objectives_data)}个部门级目标")

        # 为每个目标添加关键成果
        print("\n添加关键成果...")
        kr_count = 0
        for obj, obj_data in manager_objectives:
            kr = KeyResult(
                objective_id=obj.id,
                title=f'{obj.title} - 关键成果',
                description=f'当前进展: {obj_data["current"]}/{obj_data["target"]}',
                target_value=obj_data['target'],
                current_value=obj_data['current'],
                unit='万元' if obj.type == 'operational' else '个' if obj.type == 'strategic' else '%',
                status='active'
            )
            kr.update_progress()
            db.session.add(kr)
            kr_count += 1

        db.session.commit()
        print(f"✓ 添加了{kr_count}个关键成果")

        print("\n创建员工个人目标...")
        # 为每个员工创建个人目标
        employee_obj_templates = [
            {
                'titles': ['完成客户管理系统开发', '优化数据库性能', '完成API接口开发', '实现移动端适配'],
                'type': 'development',
                'progress_range': (60, 90)
            },
            {
                'titles': ['客户需求调研', '产品原型设计', '用户体验优化', '功能测试'],
                'type': 'strategic',
                'progress_range': (50, 80)
            }
        ]

        emp_objectives = []
        for emp in employees:
            template = random.choice(employee_obj_templates)
            # 找到对应类型的部门目标作为父目标
            parent_obj = next((obj for obj, _ in manager_objectives if obj.type == template['type']), None)
            if not parent_obj:
                # 如果没有找到相同类型的,使用第一个部门目标
                parent_obj = manager_objectives[0][0] if manager_objectives else None

            obj = Objective(
                title=random.choice(template['titles']),
                description=f'{emp.full_name}的个人目标',
                owner_id=emp.id,
                level='individual',
                type=template['type'],
                parent_id=parent_obj.id if parent_obj else None,
                start_date=start_date,
                end_date=(datetime.now() + timedelta(days=90)).date(),
                progress=random.randint(*template['progress_range']),
                status='active'
            )
            db.session.add(obj)
            emp_objectives.append(obj)

        db.session.commit()
        print(f"✓ 创建了{len(emp_objectives)}个员工个人目标")

        print("\n创建项目...")
        # 创建项目
        projects_data = [
            {
                'name': '客户管理系统V2.0',
                'description': '升级客户管理系统，增加AI智能推荐功能',
                'owner': employees[0],
                'progress': 75,
                'status': 'active',
                'days': 90
            },
            {
                'name': '移动端APP开发',
                'description': '开发iOS和Android移动应用',
                'owner': employees[1],
                'progress': 60,
                'status': 'active',
                'days': 120
            },
            {
                'name': '数据分析平台',
                'description': '构建企业级数据分析和可视化平台',
                'owner': employees[2],
                'progress': 45,
                'status': 'active',
                'days': 150
            },
            {
                'name': 'API网关升级',
                'description': '升级API网关，提升系统性能和安全性',
                'owner': employees[3],
                'progress': 85,
                'status': 'active',
                'days': 60
            },
            {
                'name': '用户体验优化',
                'description': '优化现有系统的用户界面和交互体验',
                'owner': manager,
                'progress': 50,
                'status': 'active',
                'days': 45
            }
        ]

        projects = []
        for proj_data in projects_data:
            project = Project(
                name=proj_data['name'],
                description=proj_data['description'],
                owner_id=proj_data['owner'].id,
                start_date=start_date,
                end_date=(datetime.now() + timedelta(days=proj_data['days'])).date(),
                progress=proj_data['progress'],
                status=proj_data['status']
            )
            db.session.add(project)
            projects.append(project)

        db.session.commit()
        print(f"✓ 创建了{len(projects)}个项目")

        print("\n关联项目到目标...")
        # 关联项目到部门目标
        link_count = 0
        for project in projects[:3]:  # 前3个项目关联到研发目标
            link = ProjectObjectiveLink(
                project_id=project.id,
                objective_id=manager_objectives[2][0].id,  # 研发项目零延期
                contribution_weight=1.0
            )
            db.session.add(link)
            link_count += 1

        db.session.commit()
        print(f"✓ 创建了{link_count}个项目-目标关联")

        print("\n更新员工工作状态...")
        # 为每个员工创建状态更新
        status_data = [
            {
                'employee': employees[0],
                'work_status': 'on_site',
                'location': '办公室A座5楼',
                'current_task': '正在开发客户管理系统的AI推荐模块',
                'notes': '进展顺利，预计本周完成核心功能'
            },
            {
                'employee': employees[1],
                'work_status': 'remote',
                'location': '居家办公',
                'current_task': '移动端APP的用户界面设计与开发',
                'notes': '远程协作中，每日同步进度'
            },
            {
                'employee': employees[2],
                'work_status': 'on_site',
                'location': '办公室A座5楼',
                'current_task': '数据分析平台的数据建模',
                'notes': '正在进行数据清洗和建模工作'
            },
            {
                'employee': employees[3],
                'work_status': 'out',
                'location': '客户现场',
                'current_task': 'API网关现场部署和测试',
                'notes': '在客户现场进行系统部署'
            }
        ]

        for status_info in status_data:
            status = StatusUpdate(
                user_id=status_info['employee'].id,
                work_status=status_info['work_status'],
                location=status_info['location'],
                current_task=status_info['current_task'],
                notes=status_info['notes']
            )
            db.session.add(status)

        # 主管状态
        manager_status = StatusUpdate(
            user_id=manager.id,
            work_status='on_site',
            location='办公室A座5楼',
            current_task='团队周会和项目进度评审',
            notes='协调各项目资源，确保按时交付'
        )
        db.session.add(manager_status)

        db.session.commit()
        print(f"✓ 更新了{len(status_data) + 1}个员工状态")

        print("\n" + "="*50)
        print("✓ 演示数据初始化完成!")
        print("="*50)
        print("\n登录信息:")
        print("-" * 50)
        print("主管账户:")
        print(f"  用户名: manager")
        print(f"  密码: password123")
        print(f"\n员工账户 (4个):")
        for i, emp in enumerate(employees, 1):
            print(f"  {i}. 用户名: {emp.username}, 密码: password123, 姓名: {emp.full_name}")
        print(f"\n管理员账户:")
        print(f"  用户名: admin")
        print(f"  密码: password123")
        print("-" * 50)
        print(f"\n数据统计:")
        print(f"  用户: {len(employees) + 2} (1主管 + 4员工 + 1管理员)")
        print(f"  部门目标: {len(objectives_data)}")
        print(f"  个人目标: {len(emp_objectives)}")
        print(f"  项目: {len(projects)}")
        print(f"  状态更新: {len(status_data) + 1}")
        print("-" * 50)

if __name__ == '__main__':
    init_demo_data()
